package com.cube.dp.singleton;

/**
 * @author cube.li
 * @date 2021/12/12 18:57
 * <p>
 * 懒汉式单例模式
 */
public class LazySingleton {

    /**
     * lazySingleton = new LazySingleton()这一行代码实际上是分三步执行的,伪代码如下:
     * 1.分配内存空间 memory = allocate()
     * 2.初始化对象 instance(memory)
     * 3.设置instance指向刚分配的内存地址,instance = memory,此时instance != null
     * 步骤2和步骤3之间并不存在数据依赖关系,而且无论重排前后程序的执行结果并未改变,因此这种重排优化是允许的
     * 所以要使用volatile修饰是为了避免出现指定重排
     */
    private static volatile LazySingleton lazySingleton;

    private LazySingleton() {
    }

    public static LazySingleton getInstance() {
        //phase1:判断是否创建过实例
        if (lazySingleton == null) {
            //phase2:加锁
            synchronized (LazySingleton.class) {
                //phase3:双重检测锁,再次判断是否创建过实例
                if (lazySingleton == null) {
                    lazySingleton = new LazySingleton();
                }
            }
        }
        return lazySingleton;
    }
}
